package org.jmc.refmanager.domain.service;

import java.util.List;

import org.jmc.refmanager.domain.dao.QueryParam;
import org.jmc.refmanager.domain.model.OrgUnit;

public interface OrgUnitManager {
	/**
	 * Persist a OrgUnit entity in the database
	 * 
	 * @param transientOrgUnit
	 */
	public void persist(OrgUnit transientOrgUnit);

	/**
	 * Remove a persisted OrgUnit from the database
	 * 
	 * @param persistentOrgUnit
	 */
	public void remove(OrgUnit persistentOrgUnit);

	/**
	 * Update a OrgUnit in the database
	 * 
	 * @param detachedOrgUnit
	 * @return merged OrgUnit
	 */
	public OrgUnit update(OrgUnit detachedOrgUnit);

	/**
	 * Find a OrgUnit by id. No transaction support.
	 * 
	 * @param id
	 * @return the found OrgUnit
	 */
	public OrgUnit findById(Integer id);

	/**
	 * Find a OrgUnit by id but with a transaction
	 * support. If the object is modified, then modification
	 * is commited.
	 * 
	 * @param id
	 * @return the found OrgUnit
	 */
	public OrgUnit findByIdForUpdate(Integer id);
	
	/**
	 * Find all OrgUnit
	 * 
	 * @return the found OrgUnit
	 */
	public List<OrgUnit> findAll();

	/**
	 * Retourne la liste des direction (type='C02')
	 * @return
	 */
	public List<OrgUnit> listDirections();
	
	/**
	 * Recherche tous les services dans la portee du referent ou de l'utilisateur.
	 * 
	 * Le resultat est pagine.
	 * 
	 * @return
	 */
	public List<OrgUnit> findScopedServices(String requesterUsername);

	/**
	 * Recherche tous les services dans la portee du referent ou de l'utilisateur,
	 * correspondant aux criteres de selection defini dans les parametres de la requete.
	 * 
	 * Le resultat est pagine.
	 * 
	 * @param queryParams
	 * 
	 * @return
	 */
	public List<OrgUnit> findScopedServices(QueryParam<OrgUnit> queryParams, String requesterUsername);

	/**
	 * Compte le nombre de services limites par la portee du referent ou de l'utilisateur.
	 * 
	 * @return
	 */
	public Integer countScopedServices(String requesterUsername);

	/**
	 * Compte le nombre de services limites par la portee du referent ou de l'utilisateur.
	 * 
	 * @param queryParams
	 * @return
	 */
	public Integer countScopedServices(QueryParam<OrgUnit> queryParams, String requesterUsername);

	/**
	 * Retourne le noeud pere correspondant e la portee de validation
	 * @param matricule
	 * @return
	 */
	public OrgUnit getRoot(String matricule);
	
	/**
	 * Retourne les noeuds fils dans la portee de validation
	 * 
	 * @param id
	 * @param matricule
	 * @return
	 */
	public List<OrgUnit> getChildren(Integer id, String matricule);
	
	/**
	 * 
	 * @param id
	 * @param matricule
	 * @return
	 */
	public Integer countChildren(Integer id, String matricule);
}
